#include "app_router.h"
#include "app_device.h"
#include "app_mqtt.h"
#include "app_message.h"
#include "log.h"
#include <errno.h>

#define DEVICE_NUM_MAX 5
Device *device_list[DEVICE_NUM_MAX];
int device_num = 0;
/**
 * 路由器的初始化 
 * 把自己的分发数据的函数注册到 消息队列模块中
 */


int app_router_init()
{
    log_info("app_router_init");
    app_mqtt_register_recv_callback(app_router_dispatch_data);
}


/**
 * 向路由器注册一个设备 ，并且启动该设备
 */
int app_router_register_device( Device *device )
{
    //设备清单 +1
    log_info("register device:conn_type:%d",device->conn_type);
    device_list[device_num]=device;

    device_num++;
    //启动设备
    int ret =app_device_start(device);
    if(ret<0)
    {
        log_error("app_router_register_device error");
        return -1;
    }
    return 0;
}


/**
 * 分发数据的函数 （注册到 消息队列模块中）
 * 0 接收mqtt的数据
   1 转换成message 
   2 和列表中的设备进行匹配
   3  匹配后把数据转为字节数组发给设备

 */
int app_router_dispatch_data( char *json_data,int len)
{
    Message *message = app_message_json_to_message(json_data);
    //循环列表匹配设备
    for(int i=0;i<device_num;i++)
    {   
        log_debug( "device_list[i].conn_type :%d",device_list[i]->conn_type);
        log_debug( "message->conn_type :%d",message->conn_type);
        //用连接类型 判断 message和设备是否匹配(约定每个网关相同类型的设备只能有一个)
       if( device_list[i]->conn_type == message->conn_type)
       {
            log_info("匹配设备成功 类型：%d",device_list[i]->conn_type);
            //把数据转为字节数组
            int data_len;
            char *bytes_data= app_message_message_to_bytes(message,&data_len);
            //传给匹配的设备
            app_device_recv_router(device_list[i],bytes_data,data_len);
            break;
       }
    }



}

void app_router_destroy()
{
    for (size_t i = 0; i < device_num; i++)
    {
        app_device_free(device_list[i]);
    }
    
}